home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
090
/
pctj8409.arc
/
EPSON.ASM
< prev
next >
Wrap
Assembly Source File
|
1986-09-14
|
8KB
|
215 lines
NAME EPSON
PAGE 55,132
TITLE EPSON.COM - DOUGLAS RITARI - 12/6/83
;**********************************************************************
; EPSON.COM - Version 1.0 - Setup Utility for Epson Printer
; by: Douglas Ritari
; DATE: December 6, 1983
;**********************************************************************
;
MAIN SEGMENT PARA PUBLIC 'CODE'
ORG 100H
START PROC FAR
;
ASSUME CS:MAIN
ASSUME DS:MAIN
ASSUME SS:MAIN
ASSUME ES:MAIN
;
JMP SSTART ;JUMP TO REAL START OF PROGRAM
;
;************* INITIALIZE DATA VARIABLES ******************************
;
SWITCH DB 0 ;SWITCH FOR HEX '/' SEQ.- EITHER '0' OR 'FFH'
SIXTEEN DB 16 ;THE NUMBER '16' USED IN HEX CONVERSION - MUL.
TESTPR DB 0 ;SWITCH TO TEST IF ANY OUTPUT WAS PRODUCED
DIGITS DB 0 ;NUM. OF HEX DIGITS PROCESSED - '0' OR '1'
HEX DB 0 ;HEXADECIMAL ACCUMLATOR
PARM DB 0 ;MOVE PARAMETER TO HERE - 1 BYTE AT A TIME
;
;**********************************************************************
; BEGIN PROGRAM - SAVE RETURN ADDRESS TO DOS
;**********************************************************************
;
SSTART:
PUSH DS ;SAVE PSP SEGMENT ADDRESS
MOV AX,0
PUSH AX ;SAVE RETURN ADDRESS OFFSET (PSP + 0)
;
;*************** MOVE COUNT OF CHARACTERS INTO PARM AREA **************
;
MOV SI,80H ;SOURCE STRING OFFSET (WITHIN PSP)
MOV DI,OFFSET PARM ;DEST. STRING OFFSET
CLD ;SET 'FORWARD' STRING OPERATIONS
MOVSB ;MOVE # OF PARMS ENTERED INTO 'PARM' VARIABLE
DEC DI
;
;************ SET UP PARM FIELD'S POINTERS ****************************
;
MOV AL,PARM ;PUT NUMBER OF CHAR. IN PARM IN AL REGISTER
MOV CX,AX ;PUT NUMBER OF CHAR. IN PARM IN CX REGISTER
MOV BX,OFFSET PARM ;POINT TO PARMS BASE ADDRESS
CMP CX,0 ;WERE 'NO' PARMS ENTERED ?
JE SEAREN ;SEND DEFAULTS - NO PARMS - END PROGRAM
;
;**********************************************************************
; PARM(S) WERE ENTERED - SEARCH FOR AND PROCESS PARMAMETERS
;**********************************************************************
;
SEAR: MOVSB ;READ IN PARM FROM PROG. SEGMENT PREFIX
DEC DI
MOV AL,[BX] ;MOVE NEXT PARM TO INPUT REGISTER
CMP AL,96 ;96 IS THE SMALL LETTER 'A'
JL SEARCP ;DO 'NOT' MODIFY THIS LETTER IF LOWER THAN 'a'
AND AL,223 ;REDUCE BY 32 - UNCAPS===> CAPS
SEARCP: CMP AL,'/' ;HEX SEQUENCE BEGUN OR TERMINATED
JE TOGGLE ;TURN ESCAPE SEQUENCE FLAG ON OR OFF
MOV AH,0 ;CLEAR AH REGISTER
CMP AH,SWITCH ;IS HEX SEQUENCE OFF ?
JNE PASTHRU ;PRINT CHAR.'S HEX VALUE IF HEX SWITCH IS ON
CMP AL,'E' ;PARM TO 'EMPHASIZE' ?
JE PARM_E ;PARM-E ROUTINE
CMP AL,'D' ;PARM TO 'DOUBLE-STRIKE' ?
JE PARM_D ;JUMP TO PARM-D ROUTINE
CMP AL,'C' ;PARM TO 'COMPRESS' ?
JE PARM_C ;JUMP TO COMPRESS ROUTINE
CMP AL,'T' ;PARM TO 'GOTO TOP-OF-FORM' ?
JE PARM_T ;JUMP TO TOP-OF-FORM ROUTINE
CMP AL,'R' ;PARM TO 'REINITIALIZE PRINTER' ?
JE PARM_R ;JUMP TO RESET ROUTINE
CMP AL,'I' ;PARM TO SET 'ITALIC' CHAR. ?
JE PARM_I ;JUMP TO ITALICS ROUTINE
CMP AL,'U' ;PARM TO SET 'UNI-DIRECTIONAL' PRINT MODE ?
JE PARM_U ;JUMP TO 'UNI-DIRECTIONAL' ROUTINE
CMP AL,'W' ;PARM TO SET 'WIDE' PRINT MODE ?
JE PARM_W ;JUMP TO WIDE ROUTINE
SEARBK: LOOP SEAR ;LOOP BACK FOR OTHER PARMS
;
SEAREN: JMP PGMEND ;JUMP END-PROGRAM PROCEDURE
;
;********* BACKSLASH TOGGLES HEXIDECIMAL INPUT MODE ON/OFF ************
;
; TOGGLE THE HEXADECIMAL INPUT PROC.-OFF===>ON - OR ON===>OFF
;
TOGGLE: NOT SWITCH
JMP SEARBK ;RETURN TO PARM SEARCH PROCEDURE
;
;********** EDIT FOR VALID HEXIDECIMAL NUMBERS ************************
;
PASTHRU: SUB AL,30H ;CONVERT FROM ASCII REPRES. TO REAL NUMBERS
JC BELEND ;END PROGRAM IF WRONG PARM - SOUND BELL
CMP AL,9 ;CHECK FOR DIGIT > 9
JBE PASTHR2 ;VALID NUMBER - JUMP TO MATH ROUTINE CALL
SUB AL,7 ;CONVERT FROM ASCII REPRES. TO HEX DIGITS A-F
JC BELEND ;END PROGRAM IF WRONG PARM - SOUND BELL
CMP AL,0FH ;CHECK FOR DIGIT > '15' HEX
JA BELEND ;END PROGRAM IF WRONG PARM - SOUND BELL
PASTHR2: CALL HEXMATH ;CONVERT INPUT PARM TO HEX-NUMBER
JMP SEARBK ;RETURN FOR NEXT PARM
;
;******** PRE-DEFINED EPSON PRINTER PARMS PROCEDURE *******************
;
PARM_E: MOV AL,45H ;CODE FOR 'EMPHASIZED' FONT
CALL ESCAPE
JMP SEARBK
;
PARM_D: MOV AL,47H ;CODE FOR 'DOUBLE-STRIKE' MODE
CALL ESCAPE
JMP SEARBK
;
PARM_C: MOV AL,0FH ;CODE FOR 'COMPRESSED' FONT
CALL PRINTER ;COMPRESSED MODE DOES 'NOT' NEED PRE-ESCAPE SEQ
JMP SEARBK
;
PARM_T: MOV AL,0CH ;CODE TO 'ADVANCE PAPER TO TOP-OF-FORM'
CALL PRINTER ;FORM-FEED TO TOP-OF-FORM DOESN'T NEED ESC.
JMP SEARBK
;
PARM_R: MOV AL,40H ;CANCEL ALL MODES/RESET LOGICAL TOP-OF-FORM
CALL ESCAPE
JMP SEARBK
;
PARM_I: MOV AL,34H ;CODE FOR 'ITALICS' FONT
CALL ESCAPE
JMP SEARBK
;
PARM_U: MOV AL,55H ;TURN ON UNI-DIRECTIONAL PRINT MODE
CALL ESCAPE
MOV AL,1 ;CODE TO SET UNI-DIRECTIONAL 'ON'
CALL PRINTER
JMP SEARBK
;
PARM_W: MOV AL,57H ;CODE FOR 'PERMANENT DOUBLE-WIDE' FONT
CALL ESCAPE
MOV AL,1 ;CODE TO SET WIDE 'ON'
CALL PRINTER
JMP SEARBK
;
;*************** END OF PROGRAM PROCEDURE *****************************
;
; RESTORE CONTROL TO DOS - END OF PROGRAM
;
BELEND: MOV DIGITS,0 ;CLEAR 'UNPAIRED DIGITS' HEX CHECK
MOV AL,07H ;BAD PARMS IN PROGRAM - SOUND BELL
CALL PRINTER ;PROGRAM ENDED WITH ERRORS!
PGMEND: CMP DIGITS,0 ;WAS 'UNPAIRED' HEXCODES ENTERED?
JNE BELEND ;SOUND BELL TO SIGNAL ERROR
CMP TESTPR,0 ;
JE DEFAULT ;NO OUTPUT WAS PRODUCED - SEND DEFAULT
;
RET ;RETURN TO DOS - END OF PROGRAM.
;
;**********************************************************************
; NO PARMS WERE ENTERED - DEFAULT SETTING OF DOUBLE-STRIKE/EMPHASIZE
;**********************************************************************
;
DEFAULT: MOV AL,47H ;PUT 'DOUBLE-STRIKE' CODE IN OUTPUT REGISTER
CALL ESCAPE
MOV AL,45H ;PUT 'EMPHASIZE' CODE IN OUTPUT REGISTER
CALL ESCAPE
JMP PGMEND ;JUMP TO END-OF-PROGRAM ROUTINE
;
START ENDP
;
;********** ESCAPE SUBROUTINE - SEND ESCAPE CODE TO PRINTER ***********
;
ESCAPE PROC NEAR
PUSH AX ;SAVE POTENTIAL CHAR. TO BE PRINTED ON STACK
MOV AL,1BH ;MOVE ESCAPE CHAR.(1BH) TO OUT REG.
CALL PRINTER ;CALL PRINTER SUBROUTINE
POP AX ;GET CHAR. TO BE PRINTED FROM STACK
CALL PRINTER ;CALL PRINTER OUTPUT ROUTINE
RET ;RETURN TO CALLING SUBROUTINE
ESCAPE ENDP
;
;********* PRINTER SUBROUTINE - ALL PRINTING IS DONE HERE *************
;
; SEND CHARACTER IN AL REGISTER TO PRINTER
;
PRINTER PROC NEAR
MOV TESTPR,1 ;VALID OUTPUT HAS BEEN PRODUCED
MOV DX,0 ;SET REGISTER FOR PRINTER OUTPUT INTERRUPT
MOV AH,0 ;SET REGISTER FOR PRINTER OUTPUT INTERRUPT
INT 17H ;CALL PRINTER DRIVER IN BIOS
RET ;RETURN TO CALLING SUBROUTINE
PRINTER ENDP
;
;********* CONVERT INPUT PARMS TO HEXIDECIMAL NUMBERS *****************
;
HEXMATH PROC NEAR ;ROUTINE TO CONVERT PARM TO HEX NUMBERS
CMP DIGITS,0 ;0===> 1ST # - 1===> 2ND #
JNE MATH2 ;JUMP & PROCESS 2ND #
MUL SIXTEEN ;MULTIPLE 1ST # BY 16
MOV HEX,AL ;CLEAR & STORE RESULT IN 'HEX'
INC DIGITS ;1ST NUMBER PROCESSED
RET ;RETURN TO PASTHRU ROUTINE
MATH2: ADD AL,HEX ;TOTAL THE TWO HEX DIGITS
MOV DIGITS,0 ;CLEAR DIGIT VARIABLE FOR FUTURE PARMS
CALL PRINTER ;SEND HEX # IN 'AL' REGISTER TO PRINTER
RET ;RETURN TO PASTHRU ROUTINE
HEXMATH ENDP
;
;**********************************************************************
MAIN ENDS
END START